#Datensatz einlesen
df_original <- read.csv("https://swissvotes.ch/page/dataset/swissvotes_dataset.csv", header=TRUE, sep=";", na = c("NA", "."))
#Datensatz anschauen
head(df_original)
str(df_original)
'data.frame':   676 obs. of  834 variables:
 $ anr                : num  1 2 3 4 5 6 7 8 9 10 ...
 $ datum              : chr  "12.09.1848" "14.01.1866" "14.01.1866" "14.01.1866" ...
 $ titel_kurz_d       : chr  "Bundesverfassung der schweizerischen Eidgenossenschaft" "Mass und Gewicht" "Gleichstellung der Juden und Naturalisierten mit Bezug auf Niederlassung" "Stimmrecht der Niedergelassenen in Gemeindeangelegenheiten" ...
 $ titel_kurz_f       : chr  "Constitution f\xe9d\xe9rale de la Conf\xe9d\xe9ration suisse" "Poids et mesures" "Egalit\xe9 des Juifs" "Droit de vote des Suisses \xe9tablis, en mati\xe8re communale" ...
 $ titel_off_d        : chr  "Totalrevision vom 12. September 1848" "Festsetzung von Mass und Gewicht" "Gleichstellung der Juden und Naturalisierten mit Bezug auf Niederlassung" "Stimmrecht der Niedergelassenen in Gemeindeangelegenheiten" ...
 $ titel_off_f        : chr  "R\xe9vision totale du 12 septembre 1848" "Poids et mesures" "Egalit\xe9 des citoyens au point de vue de l'\xe9tablissement et de la l\xe9gislation" "Droit de vote des Suisses \xe9tablis, en mati\xe8re communale" ...
 $ stichwort          : chr  NA NA NA NA ...
 $ swissvoteslink     : chr  "https://swissvotes.ch/vote/1.00" "https://swissvotes.ch/vote/2.00" "https://swissvotes.ch/vote/3.00" "https://swissvotes.ch/vote/4.00" ...
 $ anzahl             : int  1 9 9 9 9 9 9 9 9 9 ...
 $ rechtsform         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ kurzbetitel        : chr  "Die Gr\xfcndung des schweizerischen Bundesstaates 1848" "Wegen des St\xe4ndemehrs: Ein 'Schoppen' bleibt ein 'Schoppen'" "Das einzige Ja von 1866: Freie Niederlassung f\xfcr Juden" "Kantonsfremde Niedergelassene bleiben benachteiligt" ...
 $ anneepolitique     : chr  "" "" "" "" ...
 $ bkchrono.de        : chr  "" "" "" "" ...
 $ bkchrono.fr        : chr  "" "" "" "" ...
 $ d1e1               : int  1 1 12 1 6 1 12 1 4 4 ...
 $ d1e2               : num  1.2 1.5 12.3 1.4 6.1 1.4 12.3 1.6 4.1 4.1 ...
 $ d1e3               : num  1.21 1.52 NA 1.43 6.12 1.43 NA 1.65 4.12 4.13 ...
 $ d2e1               : int  1 NA 1 1 1 1 1 1 12 4 ...
 $ d2e2               : num  1.5 NA 1.6 1.6 1.6 1.6 1.6 1.5 12.1 4.4 ...
 $ d2e3               : num  1.52 NA 1.62 1.62 1.62 1.62 1.62 1.52 NA 4.43 ...
 $ d3e1               : int  NA NA 1 1 1 1 NA 1 1 NA ...
 $ d3e2               : num  NA NA 1.5 1.5 1.5 1.5 NA 1.6 1.5 NA ...
 $ d3e3               : num  NA NA 1.52 1.52 1.52 1.52 NA 1.62 1.52 NA ...
 $ dep                : int  NA NA 3 NA NA NA NA NA NA NA ...
 $ br.pos             : int  3 NA NA NA NA NA NA NA NA NA ...
 $ legislatur         : int  1 6 6 6 6 6 6 6 6 6 ...
 $ legisjahr          : chr  "1848-1851" "1863-1866" "1863-1866" "1863-1866" ...
 $ gesch_nr           : chr  NA NA NA NA ...
 $ curiavista.de      : chr  "" "" "" "" ...
 $ curiavista.fr      : chr  "" "" "" "" ...
 $ bv.pos             : int  3 1 1 1 1 1 1 1 1 1 ...
 $ nr.pos             : int  3 1 1 1 1 1 1 1 1 1 ...
 $ nrja               : int  NA NA NA NA NA NA NA NA NA NA ...
 $ nrnein             : int  NA NA NA NA NA NA NA NA NA NA ...
 $ sr.pos             : int  3 1 1 1 1 1 1 1 1 1 ...
 $ srja               : int  NA NA NA NA NA NA NA NA NA NA ...
 $ srnein             : int  NA NA NA NA NA NA NA NA NA NA ...
 $ dat.preexam        : chr  "0" "0" "0" "0" ...
 $ dat.start          : chr  "0" "0" "0" "0" ...
 $ dat.limit          : chr  "00.01.1900" "00.01.1900" "00.01.1900" "00.01.1900" ...
 $ sammelfrist        : int  0 0 0 0 0 0 0 0 0 0 ...
 $ unter.quorum       : int  0 0 0 0 0 0 0 0 0 0 ...
 $ dat.submit         : chr  "0" "0" "0" "0" ...
 $ dat.success        : chr  "0" "0" "0" "0" ...
 $ dat.message        : chr  NA "01.07.1865" "01.07.1865" "01.07.1865" ...
 $ dat.parl           : chr  NA "19.11.1865" "19.11.1865" "19.11.1865" ...
 $ dat.force          : chr  NA "0" NA "0" ...
 $ dauer_bv           : int  NA NA NA NA NA NA NA NA NA NA ...
 $ dauer_abst         : int  NA NA NA NA NA NA NA NA NA NA ...
 $ i.dauer_tot        : int  NA NA NA NA NA NA NA NA NA NA ...
 $ i.dauer_samm       : int  NA NA NA NA NA NA NA NA NA NA ...
 $ i.dauer_br         : int  NA NA NA NA NA NA NA NA NA NA ...
 $ fr.dauer_samm      : int  NA NA NA NA NA NA NA NA NA NA ...
 $ fr.dauer_tot       : int  NA NA NA NA NA NA NA NA NA NA ...
 $ unter_g            : int  NA NA NA NA NA NA NA NA NA NA ...
 $ unter_u            : int  NA NA NA NA NA NA NA NA NA NA ...
 $ urheber            : chr  NA NA NA NA ...
 $ info_br.de         : chr  "" "" "" "" ...
 $ info_br.fr         : chr  "" "" "" "" ...
 $ info_br.en         : chr  "" "" "" "" ...
 $ info_dep.de        : chr  "" "" "" "" ...
 $ info_dep.fr        : chr  "" "" "" "" ...
 $ info_dep.en        : chr  "" "" "" "" ...
 $ info_amt.de        : chr  "" "" "" "" ...
 $ info_amt.fr        : chr  "" "" "" "" ...
 $ info_amt.en        : chr  "" "" "" "" ...
 $ p.fdp              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.sps              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.svp              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.mitte            : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.evp              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.gps              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.glp              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.ucsp             : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.pda              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.sd               : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.edu              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.fps              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.lega             : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.kvp              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.mcg              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.cvp              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.bdp              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.lps              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.ldu              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.poch             : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.rep              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.eco              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.sgv              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.sbv              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.sgb              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.travs            : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.sav              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.vsa              : int  9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
 $ p.vpod             : int  NA NA NA NA NA NA NA NA NA NA ...
 $ p.voev             : int  NA NA NA NA NA NA NA NA NA NA ...
 $ p.tcs              : int  NA NA NA NA NA NA NA NA NA NA ...
 $ p.vcs              : int  NA NA NA NA NA NA NA NA NA NA ...
 $ p.acs              : int  NA NA NA NA NA NA NA NA NA NA ...
  [list output truncated]
#Variablen definieren um nachher mehrere Spalten gleichzeitig zu mutieren

positionen  <- df_original %>%
  select(ends_with(".pos")|starts_with("p.")|starts_with("pdev")) 

hauptthema <- df_original %>%
  select(d1e1, d2e1 ,d3e1)

unterthema <- df_original %>%
  select(d1e2, d2e2 ,d3e2)

unterunterthema <- df_original %>%
  select(d1e3, d2e3 ,d3e3)

daten <- df_original%>%
  select(datum, starts_with("dat."))

resultate <- df_original %>%
  select(ends_with("annahme")| volk | stand)

parteien <- c(".svp", ".fdp", ".sp", ".cvp", ".gsp", ".sps")
#Data-Wrangling (Variablen codieren)
data <- df_original %>%
  # filter((d1e2 > 2 & d1e2 < 4 | (d1e3 > 10.30 & d1e3 < 10.33)) |
  #        (d2e2 > 2 & d2e2 < 4 | (d2e3 > 10.30 & d2e3 < 10.33))|
  #        (d3e2 > 2 & d3e2 < 4 | (d3e3 > 10.30 & d3e3 < 10.33)) ) %>% #Filter der Themengebiete
  select(-(ends_with(".fr")|ends_with("_f")|ends_with(".en")))%>% #Entfernung französische Übersetzungen
  rename(Kurztitel = titel_kurz_d, Titel = titel_off_d, ) %>% 

    mutate(rechtsform = factor(case_when(
    rechtsform == 1 ~ "Obligatorisches Referendum",
    rechtsform == 2 ~ "Fakultatives Referendum",
    rechtsform == 3 ~ "Volksinitiative",
    rechtsform == 4 ~ "Gegenentwurf zu Volksinitiative",
    rechtsform == 5 ~ "Stichfrage")))%>% 
  
    mutate(dep = factor(case_when(
    dep == 1 ~ "EDA",
    dep == 2 ~ "EDI",
    dep == 3 ~ "EJPD",
    dep == 4 ~ "VBS",
    dep == 5 ~ "EFD",
    dep == 6 ~ "WBF",
    dep == 7 ~ "UVEK",
    dep == 8 ~ "BK")))%>%
  mutate (Jahr = as.integer(format(as.Date(datum, format='%d.%m.%Y'), format="%Y"))) %>% 
  
  mutate(across(names(positionen), 
           ~ factor(case_when(. == 1 ~ "Befürwortend",
    .== 2 ~"Ablehnend",
    .== 3 ~"Keine",
    .== 4 ~"Leere Abgabe",
    .== 5 ~"Stimmfreigabe",
    .== 8 ~"Vorzug für den Gegenentwurf",
    .== 9 ~"Vorzug für Volksinitiative",
    . == 66 ~"keine",
    . == 9999 ~"Partei ex. nicht",)))) %>%
  
  mutate(across(names(hauptthema), 
             ~ factor(case_when(. == 1 ~ "Staatsordnung",
    .== 2 ~ "Aussenpolitik",
    .== 3 ~"Sicherheitspolitik",
    .== 4 ~"Wirtschaft",
    .== 5 ~"Landwirtschaft",
    .== 6 ~"Öffentliche Finanzen",
    .== 7 ~"Energie",
    .== 8 ~"Verkehr und Infrastruktur",
    .== 9 ~"Umwelt und Lebensraum",
    .== 10 ~"Sozialpolitik",
    .== 11 ~"Bildung und Forschung",
    .== 12 ~"Kultur, Religion, Medien",))))%>%
  
  mutate(across(names(unterthema), 
             ~ factor(case_when(. == 2.1 ~ "Aussenpolitische Grundhaltung",
    .== 2.2 ~ "Europapolitik",
    .== 2.3 ~ "Internationale Organisationen",
    .== 2.4 ~ "Entwicklungszusammenarbeit",
    .== 2.5 ~ "Staatsverträge mit einzelnen Staaten",
    .== 2.6 ~"Aussenwirtschaftspolitik",
    .== 2.7 ~"Diplomatie",
    .== 2.8 ~"Auslandschweizer:innen",
    .== 3.1 ~"Öffentliche Sicherheit",
    .== 3.2 ~"Armee",
    .== 3.3 ~"Landesversorgung",
    .== 10.3 ~"Ausländer & Flüchtlinge", 
    TRUE ~"andere")))) %>%
  mutate(across(names(unterunterthema), 
             ~ factor(case_when(. == 10.31 ~ "Ausländerpolitik",
    .== 10.32 ~ "Flüchtlinge",
     TRUE ~"andere")))) %>%
  
  #mutate(across(names(daten), 
  #              ~ as.Date(., "%d.%m.%Y"))) %>%
  
  mutate(across(names(resultate), 
                ~ factor(case_when(. == 0 ~"abgelehnt", 
                .== 1 ~ "angenommen", 
                .== 3 ~ "Ständemehr nicht nötig", 
                .== 8 ~ "Gegenentwurf angenommen", 
                .== 9 ~ "Volksinitiative angenommen" )))) %>% 
  mutate(anr = as.factor(anr)) 
  

  
#Neue Variablen generieren & Datensatz selektieren

data$bet_volkja.proz <- (data$bet*(data$volkja.proz/100))

df <- data %>%
  select(anr,Jahr, Kurztitel, rechtsform, annahme, bet_volkja.proz, bet,  d1e1:br.pos, bv.pos:nr.pos, sr.pos, unter_g, unter_u, ends_with(parteien), ja.lager, nein.lager, volk:stand, volkja.proz, ktjaproz,matches("...bet"),matches("...japroz"), matches("...annahme"),swissvoteslink, anneepolitique, info_br.de, info_dep.de, info_amt.de)


#neue Variablen: prüfen, ob Thema vorkommt und wenn ja, trägt es 1 ein (sonst 0)
df$Sicherheitspolitik <- +(rowSums(df[2:12] == 'Sicherheitspolitik', na.rm = TRUE) > 0)
df$Aussenpolitik <- +(rowSums(df[2:12] == 'Aussenpolitik', na.rm = TRUE) > 0)
df$Ausländer <- +(rowSums(df[2:12] == 'Ausländerpolitik', na.rm = TRUE) > 0)
df$Flüchtlinge <- +(rowSums(df[2:12] == 'Flüchtlinge', na.rm = TRUE) > 0)

#neue Spalte: fasst Themen der neuen Spalten zusammen, alles andere wird als "anderes" kategorisiert. 
df <- df %>% 
    mutate(Thema = factor(case_when(
    Sicherheitspolitik == 1 ~ "Sicherheitspolitik",
    Aussenpolitik == 1 ~ "Aussenpolitik",
    Flüchtlinge == 1 ~ "Flüchtlinge",
    Ausländer == 1 ~ "Ausländer",
    TRUE ~"andere"))) %>% 
    mutate(Jahrzehnt = as.factor(floor(Jahr/10)*10)) %>% 
    mutate(relevant = ifelse(Thema == "andere", "nein", "ja")) 
ausländer <- df %>% 
  filter(Thema %in% c("Ausländer", "Flüchtlinge")) %>%
  filter(rechtsform != "Stichfrage") %>% 
  mutate (Faktor = c(0, 0, 0, 0, 0, 0, 0, -100, -100, 0, 0, 0, -100, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, -100 )) %>% 
  mutate(volkja.proz = abs(volkja.proz+Faktor))


#x <- ausländer %>% 
#  select(ends_with("proz")) %>% 
 # mutate(lapply(., ~ .+Faktor))
  
#lapply(x, +ausländer$Faktor)
#x

#Durchschnitt allg. Schweiz bei Abstimmungen vs. Abstimmungen über Ausländer
mean(df$bet, na.rm = TRUE)
mean(ausländer$bet)





kantone_bet <- ausländer %>%
  select(ends_with(".bet")) %>% 
  summarize(mean = colMeans(., na.rm = TRUE))

kantone_japroz <- ausländer %>% 
  select(ends_with(".japroz"))

Liste_kantone <- list(names(colMeans(ausländer[39:64])))
svp_ja <- ausländer %>% 
  filter(p.svp == "Befürwortend") %>% 
  summarize(Durchschnitt = colMeans(ausländer[39:64], na.rm = TRUE))



svp_nein <- ausländer %>% 
  filter(p.svp == "Ablehnend") %>% 
  summarise_at(c(names(kantone_japroz)), mean, na.rm = TRUE)


svp_total <- ausländer %>% 
  group_by(p.svp) %>% 
  summarise_at(c(names(kantone_japroz)), mean, na.rm = TRUE)


ggplot(svp_total, aes(p.svp, zh.japroz))+
  geom_jitter()

SVP_kt <- cbind(argh = Liste_kantone, svp_ja, svp_nein) 

colnames(SVP_kt)[1] <- "Kanton"


mean(df$volkja.proz, na.rm = TRUE)

annahmen_ausländer <- ausländer %>% 
  group_by(rechtsform) %>% 
  summarize(mean = mean(volkja.proz, na.rm = TRUE))
mean(ausländer$volkja.proz)


parteien_japroz <- ausländer %>% 
  group_by(p.svp, p.fdp, p.sps, p.cvp) %>% 
  summarize(jastimmen = mean(volkja.proz))
  
ggplot(ausländer, aes(Jahr)) + 
  geom_histogram(binwidth = 5)




ausländer[39:61]


#colMeans(ausländer["zh.bet":"ge.bet"], na.rm = TRUE)
ggplot(ausländer, aes(Jahrzehnt, fill = Thema)) + 
  geom_bar()

flüchtling <- df %>% 
  filter(Thema == "Flüchtlinge") 


#Stimmbeteiligung Kantone im Vergleich für Abstimmungen
ggplot(ausländer, aes(anr, bet, fill= annahme))+
  geom_col()

#glimpse(df)
#eingeschränkter Datensatz für Visualisierung
df_vis <- df %>% 
  select(anr, Jahr, Kurztitel, rechtsform, br.pos, Sicherheitspolitik:relevant) 
#Anzahl Abstimmungen, gruppiert nach Jahrzehnt & Thema, nebeneinander
df_vis %>% 
  group_by(Jahrzehnt, Thema) %>% 
  count() %>% 
  ggplot(aes(Jahrzehnt, n, fill = Thema)) +
  geom_bar(position="dodge", stat="identity") +
  scale_fill_brewer(palette="Spectral")


#Anzahl Abstimmungen, gruppiert nach Jahrzehnt & Thema, stacked
df_vis %>% 
  group_by(Jahrzehnt, relevant, Thema) %>% 
  count() %>% 
  ggplot(aes(Jahrzehnt, n, fill = Thema)) +
  geom_bar(position="stack", stat="identity") +
  scale_fill_brewer(palette="Spectral") +
  labs(title = "Anzahl Abstimmungen pro Jahrzehnt", subtitle =  "Gruppiert nach Themen unseres Beitrages & Rest", y = "Anzahl")





df_vis %>% 
  filter(Thema == "Ausländer"|Thema == "Flüchtlinge") %>% 
  group_by(Jahrzehnt, relevant, Thema) %>% 
  count() %>% 
  ggplot(aes(Jahrzehnt, n, fill = Thema)) +
  geom_bar(position="dodge", stat="identity") +
  scale_fill_brewer(palette="Spectral") +
  labs(title = "Anzahl Abstimmungen pro Jahrzehnt", subtitle =  "Gruppiert nach Themen unseres Beitrages & Rest", y = "Anzahl")



df %>% 
  filter(Thema == "Ausländer"|Thema == "Flüchtlinge") %>% 
  group_by(Jahrzehnt, Thema, annahme) %>% 
  count() %>% 
  ggplot(aes(Jahrzehnt, n, fill = annahme)) +
  geom_bar(position="stack", stat="identity") +
  #scale_fill_brewer(palette="Spectral") +
  labs(title = "Anzahl Abstimmungen zu Flüchtlinge / Ausländer", subtitle =  "Angenommene & abgelehnte", y = "Anzahl")

#Abstimmungen, gruppiert nach Rechtsform & Jahrzehnt
df %>% 
  filter(relevant == "ja") %>% 
  group_by(Jahrzehnt, rechtsform, Thema,annahme) %>% 
  count() %>% 
  ggplot(aes(Jahrzehnt, rechtsform, color = annahme)) +
  geom_jitter() +
  #scale_color_brewer(palette="Spectral") +
  facet_wrap(~Thema)

#Anzahl Abstimmungen pro Jahrzehnt in Zahlen (nur relevante Themen)
df %>% 
  filter(Jahr > 1910, relevant == "ja") %>% 
  group_by(Jahrzehnt, Thema) %>% 
  count()

#Anzahl Abstimmungen pro Rechtsform + Position Bundesrat in Zahlen (nur relevante Themen)
df_vis %>% 
  filter(Jahr > 1910, relevant == "ja") %>% 
  group_by(rechtsform, Thema, br.pos) %>% 
  count()


ausländer <- df %>% 
  filter(Thema == "Ausländer")

flucht <- df %>% 
  filter(Thema == "Flüchtlinge")

  

positionen_br <- ggplot(df, aes( Jahr,rechtsform, color = br.pos )) + geom_jitter() + scale_color_brewer(palette="Spectral") 

positionen_br


ggplot(df, aes(Jahr, br.pos, color = Thema, shape = rechtsform)) +
  geom_jitter(alpha = 0.7) +
  scale_color_brewer(palette="Spectral") 

  #scale_y_discrete(breaks = seq(1820, 2022, 10))

  df %>% 
  filter(relevant == "ja") %>% 
  ggplot(aes(br.pos, Thema, color = rechtsform), na.rm = TRUE) +
  geom_jitter(alpha = 0.7)   +
  scale_color_brewer(palette="Spectral") 

  #scale_y_discrete(breaks = seq(1820, 2022, 10))
  
  
  df %>% 
  filter(relevant == "ja") %>% 
  ggplot(aes(Thema, rechtsform, color = br.pos)) +
  geom_jitter() 

  #scale_color_brewer(palette="Spectral") 
  #scale_y_discrete(breaks = seq(1820, 2022, 10))
  
  
  df %>% 
  filter(relevant == "ja") %>% 
  ggplot(aes(Jahr, br.pos, shape = Thema, color = rechtsform)) +
  geom_jitter(alpha = 0.7) +
  scale_color_brewer(palette="Spectral") 

  #scale_y_discrete(breaks = seq(1820, 2022, 10))
ggplot(df, aes(Jahr, volk, color = Thema, size = volkja.proz)) +
    geom_jitter() +
    scale_color_brewer(palette="Spectral") 



df %>% 
  filter(relevant == 1) %>% 
  ggplot(aes(Jahr, volk, color = Thema, size = volkja.proz)) +
    geom_jitter() +
    scale_color_brewer(palette="Spectral") 

df_vis %>% 
  group_by(Jahr, relevant, Thema) %>% 
  count() %>% 
  ggplot(aes(Jahr, n, fill = Thema)) +
  geom_bar(position="stack", stat="identity") +
  scale_fill_brewer(palette="Spectral")

df_vis %>% 
  group_by(Jahrzehnt, Jahr, relevant, Thema) %>% 
  count() %>% 
  ggplot(aes(Jahr, n, color = Thema)) +
  geom_point() +
  facet_wrap(~Jahrzehnt)

df_vis %>% 
  group_by(Jahrzehnt, relevant, Thema) %>% 
  count() %>% 
  ggplot(aes(Jahrzehnt, n, fill = relevant)) +
  geom_bar(position="dodge", stat="identity") 


ggplot(df_vis, aes(Jahr, Thema))+
  geom_col()

ggplot(df, aes(Jahr)) + 
  geom_histogram()



df %>% 
  mutate(Jahrzehnt = as.factor(floor(Jahr/10)*10)) %>%
  group_by(Jahrzehnt, d1e1) %>% 
  count() %>% 
  ggplot(aes(Jahrzehnt, n, fill = d1e1)) + 
  geom_bar(position="dodge", stat="identity") +
  scale_fill_brewer(palette="Spectral")

df %>% 
  select(Jahrzehnt, relevant) %>% 
  group_by(Jahrzehnt, relevant) %>% 
  count() %>% 
  ggplot(aes(Jahrzehnt, n, color = relevant)) + 
  geom_bar(position="dodge", stat="identity") +
  scale_fill_brewer(palette="Spectral")



df %>% 
  select(Jahrzehnt, titel_kurz_d) %>% 
  group_by(Jahrzehnt) %>% 
  count() %>% 
  ggplot(aes(Jahrzehnt, n)) + 
  geom_bar(position="dodge", stat="identity") +
  scale_fill_brewer(palette="Spectral")
Error in `select()`:
! Can't subset columns past the end.
x Column `titel_kurz_d` doesn't exist.
Backtrace:
  1. ... %>% ggplot(aes(Jahrzehnt, n))
  6. dplyr:::select.data.frame(., Jahrzehnt, titel_kurz_d)
  9. tidyselect::eval_select(expr(c(...)), .data)
 10. tidyselect:::eval_select_impl(...)
 19. tidyselect:::vars_select_eval(...)
     ...
 22. tidyselect:::reduce_sels(node, data_mask, context_mask, init = init)
 23. tidyselect:::walk_data_tree(new, data_mask, context_mask)
 24. tidyselect:::as_indices_sel_impl(...)
 25. tidyselect:::as_indices_impl(x, vars, call = call, strict = strict)
 26. tidyselect:::chr_as_locations(x, vars, call = call)
df %>% mutate(Jahrzehnt = as.factor(floor(Jahr/10)*10)) %>%
  select(Jahr, Jahrzehnt, Sicherheitspolitik, Aussenpolitik, Ausländer) %>% 
  group_by(Jahr) %>% 
  ggplot(aes(Jahr)) + 
  geom_histogram() 

NA
NA
NA
df %>% 
  mutate(Jahrzehnt = as.factor(floor(Jahr/10)*10)) %>%
  filter(d1e1|d2e1|d3e1 %in% c("Aussenpolitik", "Sicherheitspolitik", "Sozialpolitik")) %>% 
  group_by(Jahrzehnt, d1e1, d2e1) %>% 
  count() %>% 
  ggplot(aes(Jahrzehnt, n, fill = d1e1)) + 
  geom_col(position="dodge", stat="identity") +
  scale_fill_brewer(palette="Spectral")
‘|’ not meaningful for factorsIgnoring unknown parameters: stat

df %>% 
  mutate(Jahrzehnt = as.factor(floor(Jahr/10)*10)) %>%
  filter(d1e1 %in% c("Aussenpolitik", "Sicherheitspolitik", "Sozialpolitik")) %>% 
  group_by(Jahrzehnt, d1e1, d2e1) %>% 
  count() %>% 
  ggplot(aes(Jahrzehnt, n, fill = d1e1)) + 
  geom_col(position="dodge", stat="identity") +
  scale_fill_brewer(palette="Spectral")
Ignoring unknown parameters: stat

df %>% 
  mutate(Jahrzehnt = as.factor(floor(Jahr/10)*10)) %>%
  filter(d1e1|d2e1|d3e1 %in% c("Aussenpolitik", "Sicherheitspolitik", "Sozialpolitik")) %>% 
  group_by(d1e1, Jahr) %>% 
  count() 
‘|’ not meaningful for factors
# Alter code-chunk
# df_neu <- df_clean %>%
#  filter(d1e3|d2e3|d3e3 %in% themen) %>%
#  select_if(~sum(!is.na(.)) > 0) %>% #nur Spalten wählen, die nicht zu 100% NAs sind
#  rowwise() %>%
#  mutate(alle_kat = list(c(d1e3,  d2e3,  d3e3))) %>%
#  mutate(alle_kat = list(alle_kat[!is.na(alle_kat)])) 
thema_volk <- inner_join(aus_anr, volkja_proz_tab)
Joining, by = "anr"
korrektur <- c(0,0,0,0,0,0,0,100,100,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,100)
kantone_japroz_korr <- data.frame(kantone_japroz)
kantone_japroz_korr <- bind_cols(kantone_japroz_korr, thema_volk)

for (i in 1:length(kantone_japroz_korr)) {
  kantone_japroz_korr[,i] <- abs(kantone_japroz_korr[,i] -korrektur)
}

kantone_japroz_korr$ju.japroz <- NULL
kantone_japroz_mean <- data.frame(colMeans(kantone_japroz_korr))
kantone_japroz_mean <- kantone_japroz_mean %>% 
  mutate(contra_verschärfung = 100- kantone_japroz_mean$colMeans.kantone_japroz_korr.)

kantone_japroz_mean <- kantone_japroz_mean %>% 
  rename(pro_verschärfung = colMeans.kantone_japroz_korr.)

kantone_japroz_mean["Kantone"] <- rownames(kantone_japroz_mean)

kantone_japroz_mean <- kantone_japroz_mean %>% 
  pivot_longer(
    cols = pro_verschärfung:contra_verschärfung, 
    names_to = "Position", 
    values_to = "Prozent"
)

verschärfung <- ggplot(kantone_japroz_mean, aes(x=reorder(Kantone, Prozent), y=Prozent, fill=Position))+
  geom_bar(position="stack", stat = "identity")+
  theme(axis.text.x = element_text(angle = 90))

ggplotly(verschärfung)
test <- ausländer %>% 
  select(Kurztitel, zhja.proz)
Error in `select()`:
! Can't subset columns past the end.
x Column `zhja.proz` doesn't exist.
Backtrace:
  1. ausländer %>% select(Kurztitel, zhja.proz)
  3. dplyr:::select.data.frame(., Kurztitel, zhja.proz)
  6. tidyselect::eval_select(expr(c(...)), .data)
  7. tidyselect:::eval_select_impl(...)
 16. tidyselect:::vars_select_eval(...)
     ...
 19. tidyselect:::reduce_sels(node, data_mask, context_mask, init = init)
 20. tidyselect:::walk_data_tree(new, data_mask, context_mask)
 21. tidyselect:::as_indices_sel_impl(...)
 22. tidyselect:::as_indices_impl(x, vars, call = call, strict = strict)
 23. tidyselect:::chr_as_locations(x, vars, call = call)
xlsxFile <- "https://www.sem.admin.ch/dam/sem/de/data/publiservice/statistik/asylstatistik/uebersichten/gesuche-nation-ab-1986-d.xlsx.download.xlsx/gesuche-nation-ab-1986-d.xlsx"
as_nation <- read.xlsx(xlsxFile)
as_nation[1,1] <- "Country"
as_nation[1,38] <- "2022"
as.character(as_nation[1, ])
 [1] "Country" "1986"    "1987"    "1988"    "1989"    "1990"    "1991"    "1992"    "1993"    "1994"    "1995"    "1996"    "1997"    "1998"    "1999"    "2000"   
[17] "2001"    "2002"    "2003"    "2004"    "2005"    "2006"    "2007"    "2008"    "2009"    "2010"    "2011"    "2012"    "2013"    "2014"    "2015"    "2016"   
[33] "2017"    "2018"    "2019"    "2020"    "2021"    "2022"   
names(as_nation) <- as_nation[1,]
as_nation <- as_nation[-1,]
total <- as_nation[186,]
as_nation <- as_nation[-186,]
cum_nat <- as_nation %>% 
  pivot_longer(
    cols = "1986":"2022",
    names_to = "Jahr", 
    values_to = "Anzahl"
  )

cum_nat <- transform(cum_nat, Anzahl = as.numeric(Anzahl))

top_land <- aggregate(cum_nat$Anzahl, by=list(Land=cum_nat$Country), FUN=sum)
top_land <- top_land %>% 
  arrange(desc(x)) %>% 
  ungroup()

laender <- as_nation[,1]

top_20 <- top_land %>% 
  mutate(Land=ifelse(Land %in% head(Land, 20), 
                     Land, "Andere"))
top_20 <- aggregate(top_20$x, by=list(Herkunftsland=top_20$Land), FUN=sum)
LS0tCnRpdGxlOiAiQ0RBMiBDaGFsbGVuZ2UiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKI0xpYnJhcnlzIGluc3RhbGxpZXJlbgpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShuZXR3b3JrRDMpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGVzcXVpc3NlKQpsaWJyYXJ5KGhpZ2hjaGFydGVyKQpsaWJyYXJ5KG9wZW54bHN4KQpgYGAKCgpgYGB7cn0KI0RhdGVuc2F0eiBlaW5sZXNlbgpkZl9vcmlnaW5hbCA8LSByZWFkLmNzdigiaHR0cHM6Ly9zd2lzc3ZvdGVzLmNoL3BhZ2UvZGF0YXNldC9zd2lzc3ZvdGVzX2RhdGFzZXQuY3N2IiwgaGVhZGVyPVRSVUUsIHNlcD0iOyIsIG5hID0gYygiTkEiLCAiLiIpKQpgYGAKCgoKYGBge3J9CiNEYXRlbnNhdHogYW5zY2hhdWVuCmhlYWQoZGZfb3JpZ2luYWwpCnN0cihkZl9vcmlnaW5hbCkKCmBgYAoKCgpgYGB7cn0KI1ZhcmlhYmxlbiBkZWZpbmllcmVuIHVtIG5hY2hoZXIgbWVocmVyZSBTcGFsdGVuIGdsZWljaHplaXRpZyB6dSBtdXRpZXJlbgoKcG9zaXRpb25lbiAgPC0gZGZfb3JpZ2luYWwgJT4lCiAgc2VsZWN0KGVuZHNfd2l0aCgiLnBvcyIpfHN0YXJ0c193aXRoKCJwLiIpfHN0YXJ0c193aXRoKCJwZGV2IikpIAoKaGF1cHR0aGVtYSA8LSBkZl9vcmlnaW5hbCAlPiUKICBzZWxlY3QoZDFlMSwgZDJlMSAsZDNlMSkKCnVudGVydGhlbWEgPC0gZGZfb3JpZ2luYWwgJT4lCiAgc2VsZWN0KGQxZTIsIGQyZTIgLGQzZTIpCgp1bnRlcnVudGVydGhlbWEgPC0gZGZfb3JpZ2luYWwgJT4lCiAgc2VsZWN0KGQxZTMsIGQyZTMgLGQzZTMpCgpkYXRlbiA8LSBkZl9vcmlnaW5hbCU+JQogIHNlbGVjdChkYXR1bSwgc3RhcnRzX3dpdGgoImRhdC4iKSkKCnJlc3VsdGF0ZSA8LSBkZl9vcmlnaW5hbCAlPiUKICBzZWxlY3QoZW5kc193aXRoKCJhbm5haG1lIil8IHZvbGsgfCBzdGFuZCkKCnBhcnRlaWVuIDwtIGMoIi5zdnAiLCAiLmZkcCIsICIuc3AiLCAiLmN2cCIsICIuZ3NwIiwgIi5zcHMiKQoKYGBgCgoKYGBge3J9CiNEYXRhLVdyYW5nbGluZyAoVmFyaWFibGVuIGNvZGllcmVuKQpkYXRhIDwtIGRmX29yaWdpbmFsICU+JQogICMgZmlsdGVyKChkMWUyID4gMiAmIGQxZTIgPCA0IHwgKGQxZTMgPiAxMC4zMCAmIGQxZTMgPCAxMC4zMykpIHwKICAjICAgICAgICAoZDJlMiA+IDIgJiBkMmUyIDwgNCB8IChkMmUzID4gMTAuMzAgJiBkMmUzIDwgMTAuMzMpKXwKICAjICAgICAgICAoZDNlMiA+IDIgJiBkM2UyIDwgNCB8IChkM2UzID4gMTAuMzAgJiBkM2UzIDwgMTAuMzMpKSApICU+JSAjRmlsdGVyIGRlciBUaGVtZW5nZWJpZXRlCiAgc2VsZWN0KC0oZW5kc193aXRoKCIuZnIiKXxlbmRzX3dpdGgoIl9mIil8ZW5kc193aXRoKCIuZW4iKSkpJT4lICNFbnRmZXJudW5nIGZyYW56w7ZzaXNjaGUgw5xiZXJzZXR6dW5nZW4KICByZW5hbWUoS3VyenRpdGVsID0gdGl0ZWxfa3Vyel9kLCBUaXRlbCA9IHRpdGVsX29mZl9kLCApICU+JSAKCiAgICBtdXRhdGUocmVjaHRzZm9ybSA9IGZhY3RvcihjYXNlX3doZW4oCiAgICByZWNodHNmb3JtID09IDEgfiAiT2JsaWdhdG9yaXNjaGVzIFJlZmVyZW5kdW0iLAogICAgcmVjaHRzZm9ybSA9PSAyIH4gIkZha3VsdGF0aXZlcyBSZWZlcmVuZHVtIiwKICAgIHJlY2h0c2Zvcm0gPT0gMyB+ICJWb2xrc2luaXRpYXRpdmUiLAogICAgcmVjaHRzZm9ybSA9PSA0IH4gIkdlZ2VuZW50d3VyZiB6dSBWb2xrc2luaXRpYXRpdmUiLAogICAgcmVjaHRzZm9ybSA9PSA1IH4gIlN0aWNoZnJhZ2UiKSkpJT4lIAogIAogICAgbXV0YXRlKGRlcCA9IGZhY3RvcihjYXNlX3doZW4oCiAgICBkZXAgPT0gMSB+ICJFREEiLAogICAgZGVwID09IDIgfiAiRURJIiwKICAgIGRlcCA9PSAzIH4gIkVKUEQiLAogICAgZGVwID09IDQgfiAiVkJTIiwKICAgIGRlcCA9PSA1IH4gIkVGRCIsCiAgICBkZXAgPT0gNiB+ICJXQkYiLAogICAgZGVwID09IDcgfiAiVVZFSyIsCiAgICBkZXAgPT0gOCB+ICJCSyIpKSklPiUKICBtdXRhdGUgKEphaHIgPSBhcy5pbnRlZ2VyKGZvcm1hdChhcy5EYXRlKGRhdHVtLCBmb3JtYXQ9JyVkLiVtLiVZJyksIGZvcm1hdD0iJVkiKSkpICU+JSAKICAKICBtdXRhdGUoYWNyb3NzKG5hbWVzKHBvc2l0aW9uZW4pLCAKICAgICAgICAgICB+IGZhY3RvcihjYXNlX3doZW4oLiA9PSAxIH4gIkJlZsO8cndvcnRlbmQiLAogICAgLj09IDIgfiJBYmxlaG5lbmQiLAogICAgLj09IDMgfiJLZWluZSIsCiAgICAuPT0gNCB+IkxlZXJlIEFiZ2FiZSIsCiAgICAuPT0gNSB+IlN0aW1tZnJlaWdhYmUiLAogICAgLj09IDggfiJWb3J6dWcgZsO8ciBkZW4gR2VnZW5lbnR3dXJmIiwKICAgIC49PSA5IH4iVm9yenVnIGbDvHIgVm9sa3Npbml0aWF0aXZlIiwKICAgIC4gPT0gNjYgfiJrZWluZSIsCiAgICAuID09IDk5OTkgfiJQYXJ0ZWkgZXguIG5pY2h0IiwpKSkpICU+JQogIAogIG11dGF0ZShhY3Jvc3MobmFtZXMoaGF1cHR0aGVtYSksIAogICAgICAgICAgICAgfiBmYWN0b3IoY2FzZV93aGVuKC4gPT0gMSB+ICJTdGFhdHNvcmRudW5nIiwKICAgIC49PSAyIH4gIkF1c3NlbnBvbGl0aWsiLAogICAgLj09IDMgfiJTaWNoZXJoZWl0c3BvbGl0aWsiLAogICAgLj09IDQgfiJXaXJ0c2NoYWZ0IiwKICAgIC49PSA1IH4iTGFuZHdpcnRzY2hhZnQiLAogICAgLj09IDYgfiLDlmZmZW50bGljaGUgRmluYW56ZW4iLAogICAgLj09IDcgfiJFbmVyZ2llIiwKICAgIC49PSA4IH4iVmVya2VociB1bmQgSW5mcmFzdHJ1a3R1ciIsCiAgICAuPT0gOSB+IlVtd2VsdCB1bmQgTGViZW5zcmF1bSIsCiAgICAuPT0gMTAgfiJTb3ppYWxwb2xpdGlrIiwKICAgIC49PSAxMSB+IkJpbGR1bmcgdW5kIEZvcnNjaHVuZyIsCiAgICAuPT0gMTIgfiJLdWx0dXIsIFJlbGlnaW9uLCBNZWRpZW4iLCkpKSklPiUKICAKICBtdXRhdGUoYWNyb3NzKG5hbWVzKHVudGVydGhlbWEpLCAKICAgICAgICAgICAgIH4gZmFjdG9yKGNhc2Vfd2hlbiguID09IDIuMSB+ICJBdXNzZW5wb2xpdGlzY2hlIEdydW5kaGFsdHVuZyIsCiAgICAuPT0gMi4yIH4gIkV1cm9wYXBvbGl0aWsiLAogICAgLj09IDIuMyB+ICJJbnRlcm5hdGlvbmFsZSBPcmdhbmlzYXRpb25lbiIsCiAgICAuPT0gMi40IH4gIkVudHdpY2tsdW5nc3p1c2FtbWVuYXJiZWl0IiwKICAgIC49PSAyLjUgfiAiU3RhYXRzdmVydHLDpGdlIG1pdCBlaW56ZWxuZW4gU3RhYXRlbiIsCiAgICAuPT0gMi42IH4iQXVzc2Vud2lydHNjaGFmdHNwb2xpdGlrIiwKICAgIC49PSAyLjcgfiJEaXBsb21hdGllIiwKICAgIC49PSAyLjggfiJBdXNsYW5kc2Nod2VpemVyOmlubmVuIiwKICAgIC49PSAzLjEgfiLDlmZmZW50bGljaGUgU2ljaGVyaGVpdCIsCiAgICAuPT0gMy4yIH4iQXJtZWUiLAogICAgLj09IDMuMyB+IkxhbmRlc3ZlcnNvcmd1bmciLAogICAgLj09IDEwLjMgfiJBdXNsw6RuZGVyICYgRmzDvGNodGxpbmdlIiwgCiAgICBUUlVFIH4iYW5kZXJlIikpKSkgJT4lCiAgbXV0YXRlKGFjcm9zcyhuYW1lcyh1bnRlcnVudGVydGhlbWEpLCAKICAgICAgICAgICAgIH4gZmFjdG9yKGNhc2Vfd2hlbiguID09IDEwLjMxIH4gIkF1c2zDpG5kZXJwb2xpdGlrIiwKICAgIC49PSAxMC4zMiB+ICJGbMO8Y2h0bGluZ2UiLAogICAgIFRSVUUgfiJhbmRlcmUiKSkpKSAlPiUKICAKICBtdXRhdGUoYWNyb3NzKG5hbWVzKGRhdGVuKSwgCiAgICAgICAgICAgICAgICB+IGFzLkRhdGUoLiwgIiVkLiVtLiVZIikpKSAlPiUKICAKICBtdXRhdGUoYWNyb3NzKG5hbWVzKHJlc3VsdGF0ZSksIAogICAgICAgICAgICAgICAgfiBmYWN0b3IoY2FzZV93aGVuKC4gPT0gMCB+ImFiZ2VsZWhudCIsIAogICAgICAgICAgICAgICAgLj09IDEgfiAiYW5nZW5vbW1lbiIsIAogICAgICAgICAgICAgICAgLj09IDMgfiAiU3TDpG5kZW1laHIgbmljaHQgbsO2dGlnIiwgCiAgICAgICAgICAgICAgICAuPT0gOCB+ICJHZWdlbmVudHd1cmYgYW5nZW5vbW1lbiIsIAogICAgICAgICAgICAgICAgLj09IDkgfiAiVm9sa3Npbml0aWF0aXZlIGFuZ2Vub21tZW4iICkpKSkgJT4lIAogIG11dGF0ZShhbnIgPSBhcy5mYWN0b3IoYW5yKSkgCiAgCgogIApgYGAKCgpgYGB7cn0gCiNOZXVlIFZhcmlhYmxlbiBnZW5lcmllcmVuICYgRGF0ZW5zYXR6IHNlbGVrdGllcmVuCgpkYXRhJGJldF92b2xramEucHJveiA8LSAoZGF0YSRiZXQqKGRhdGEkdm9sa2phLnByb3ovMTAwKSkKCmRmIDwtIGRhdGEgJT4lCiAgc2VsZWN0KGFucixKYWhyLCBLdXJ6dGl0ZWwsIHJlY2h0c2Zvcm0sIGFubmFobWUsIGJldF92b2xramEucHJveiwgYmV0LCAgZDFlMTpici5wb3MsIGJ2LnBvczpuci5wb3MsIHNyLnBvcywgdW50ZXJfZywgdW50ZXJfdSwgZW5kc193aXRoKHBhcnRlaWVuKSwgamEubGFnZXIsIG5laW4ubGFnZXIsIHZvbGs6c3RhbmQsIHZvbGtqYS5wcm96LCBrdGphcHJveixtYXRjaGVzKCIuLi5iZXQiKSxtYXRjaGVzKCIuLi5qYXByb3oiKSwgbWF0Y2hlcygiLi4uYW5uYWhtZSIpLHN3aXNzdm90ZXNsaW5rLCBhbm5lZXBvbGl0aXF1ZSwgaW5mb19ici5kZSwgaW5mb19kZXAuZGUsIGluZm9fYW10LmRlKQoKCiNuZXVlIFZhcmlhYmxlbjogcHLDvGZlbiwgb2IgVGhlbWEgdm9ya29tbXQgdW5kIHdlbm4gamEsIHRyw6RndCBlcyAxIGVpbiAoc29uc3QgMCkKZGYkU2ljaGVyaGVpdHNwb2xpdGlrIDwtICsocm93U3VtcyhkZlsyOjEyXSA9PSAnU2ljaGVyaGVpdHNwb2xpdGlrJywgbmEucm0gPSBUUlVFKSA+IDApCmRmJEF1c3NlbnBvbGl0aWsgPC0gKyhyb3dTdW1zKGRmWzI6MTJdID09ICdBdXNzZW5wb2xpdGlrJywgbmEucm0gPSBUUlVFKSA+IDApCmRmJEF1c2zDpG5kZXIgPC0gKyhyb3dTdW1zKGRmWzI6MTJdID09ICdBdXNsw6RuZGVycG9saXRpaycsIG5hLnJtID0gVFJVRSkgPiAwKQpkZiRGbMO8Y2h0bGluZ2UgPC0gKyhyb3dTdW1zKGRmWzI6MTJdID09ICdGbMO8Y2h0bGluZ2UnLCBuYS5ybSA9IFRSVUUpID4gMCkKCiNuZXVlIFNwYWx0ZTogZmFzc3QgVGhlbWVuIGRlciBuZXVlbiBTcGFsdGVuIHp1c2FtbWVuLCBhbGxlcyBhbmRlcmUgd2lyZCBhbHMgImFuZGVyZXMiIGthdGVnb3Jpc2llcnQuIApkZiA8LSBkZiAlPiUgCiAgICBtdXRhdGUoVGhlbWEgPSBmYWN0b3IoY2FzZV93aGVuKAogICAgU2ljaGVyaGVpdHNwb2xpdGlrID09IDEgfiAiU2ljaGVyaGVpdHNwb2xpdGlrIiwKICAgIEF1c3NlbnBvbGl0aWsgPT0gMSB+ICJBdXNzZW5wb2xpdGlrIiwKICAgIEZsw7xjaHRsaW5nZSA9PSAxIH4gIkZsw7xjaHRsaW5nZSIsCiAgICBBdXNsw6RuZGVyID09IDEgfiAiQXVzbMOkbmRlciIsCiAgICBUUlVFIH4iYW5kZXJlIikpKSAlPiUgCiAgICBtdXRhdGUoSmFocnplaG50ID0gYXMuZmFjdG9yKGZsb29yKEphaHIvMTApKjEwKSkgJT4lIAogICAgbXV0YXRlKHJlbGV2YW50ID0gaWZlbHNlKFRoZW1hID09ICJhbmRlcmUiLCAibmVpbiIsICJqYSIpKSAKCmBgYAoKCmBgYHtyfSAKYXVzbMOkbmRlciA8LSBkZiAlPiUgCiAgZmlsdGVyKFRoZW1hICVpbiUgYygiQXVzbMOkbmRlciIsICJGbMO8Y2h0bGluZ2UiKSkgJT4lCiAgZmlsdGVyKHJlY2h0c2Zvcm0gIT0gIlN0aWNoZnJhZ2UiKSAlPiUgCiAgbXV0YXRlIChGYWt0b3IgPSBjKDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0xMDAsIC0xMDAsIDAsIDAsIDAsIC0xMDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAtMTAwICkpICU+JSAKICBtdXRhdGUodm9sa2phLnByb3ogPSBhYnModm9sa2phLnByb3orRmFrdG9yKSkKCgojeCA8LSBhdXNsw6RuZGVyICU+JSAKIyAgc2VsZWN0KGVuZHNfd2l0aCgicHJveiIpKSAlPiUgCiAjIG11dGF0ZShsYXBwbHkoLiwgfiAuK0Zha3RvcikpCiAgCiNsYXBwbHkoeCwgK2F1c2zDpG5kZXIkRmFrdG9yKQojeAoKI0R1cmNoc2Nobml0dCBhbGxnLiBTY2h3ZWl6IGJlaSBBYnN0aW1tdW5nZW4gdnMuIEFic3RpbW11bmdlbiDDvGJlciBBdXNsw6RuZGVyCm1lYW4oZGYkYmV0LCBuYS5ybSA9IFRSVUUpCm1lYW4oYXVzbMOkbmRlciRiZXQpCgoKCgoKa2FudG9uZV9iZXQgPC0gYXVzbMOkbmRlciAlPiUKICBzZWxlY3QoZW5kc193aXRoKCIuYmV0IikpICU+JSAKICBzdW1tYXJpemUobWVhbiA9IGNvbE1lYW5zKC4sIG5hLnJtID0gVFJVRSkpCgprYW50b25lX2phcHJveiA8LSBhdXNsw6RuZGVyICU+JSAKICBzZWxlY3QoZW5kc193aXRoKCIuamFwcm96IikpCgpMaXN0ZV9rYW50b25lIDwtIGxpc3QobmFtZXMoY29sTWVhbnMoYXVzbMOkbmRlclszOTo2NF0pKSkKYGBgCgoKYGBge3J9IApzdnBfamEgPC0gYXVzbMOkbmRlciAlPiUgCiAgZmlsdGVyKHAuc3ZwID09ICJCZWbDvHJ3b3J0ZW5kIikgJT4lIAogIHN1bW1hcml6ZShEdXJjaHNjaG5pdHQgPSBjb2xNZWFucyhhdXNsw6RuZGVyWzM5OjY0XSwgbmEucm0gPSBUUlVFKSkKCgoKc3ZwX25laW4gPC0gYXVzbMOkbmRlciAlPiUgCiAgZmlsdGVyKHAuc3ZwID09ICJBYmxlaG5lbmQiKSAlPiUgCiAgc3VtbWFyaXNlX2F0KGMobmFtZXMoa2FudG9uZV9qYXByb3opKSwgbWVhbiwgbmEucm0gPSBUUlVFKQoKCnN2cF90b3RhbCA8LSBhdXNsw6RuZGVyICU+JSAKICBncm91cF9ieShwLnN2cCkgJT4lIAogIHN1bW1hcmlzZV9hdChjKG5hbWVzKGthbnRvbmVfamFwcm96KSksIG1lYW4sIG5hLnJtID0gVFJVRSkKCgpnZ3Bsb3Qoc3ZwX3RvdGFsLCBhZXMocC5zdnAsIHpoLmphcHJveikpKwogIGdlb21faml0dGVyKCkKClNWUF9rdCA8LSBjYmluZChhcmdoID0gTGlzdGVfa2FudG9uZSwgc3ZwX2phLCBzdnBfbmVpbikgCgpjb2xuYW1lcyhTVlBfa3QpWzFdIDwtICJLYW50b24iCgoKbWVhbihkZiR2b2xramEucHJveiwgbmEucm0gPSBUUlVFKQoKYW5uYWhtZW5fYXVzbMOkbmRlciA8LSBhdXNsw6RuZGVyICU+JSAKICBncm91cF9ieShyZWNodHNmb3JtKSAlPiUgCiAgc3VtbWFyaXplKG1lYW4gPSBtZWFuKHZvbGtqYS5wcm96LCBuYS5ybSA9IFRSVUUpKQptZWFuKGF1c2zDpG5kZXIkdm9sa2phLnByb3opCgoKcGFydGVpZW5famFwcm96IDwtIGF1c2zDpG5kZXIgJT4lIAogIGdyb3VwX2J5KHAuc3ZwLCBwLmZkcCwgcC5zcHMsIHAuY3ZwKSAlPiUgCiAgc3VtbWFyaXplKGphc3RpbW1lbiA9IG1lYW4odm9sa2phLnByb3opKQogIApnZ3Bsb3QoYXVzbMOkbmRlciwgYWVzKEphaHIpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSkKCgoKCmF1c2zDpG5kZXJbMzk6NjFdCgoKI2NvbE1lYW5zKGF1c2zDpG5kZXJbInpoLmJldCI6ImdlLmJldCJdLCBuYS5ybSA9IFRSVUUpCmdncGxvdChhdXNsw6RuZGVyLCBhZXMoSmFocnplaG50LCBmaWxsID0gVGhlbWEpKSArIAogIGdlb21fYmFyKCkKCmZsw7xjaHRsaW5nIDwtIGRmICU+JSAKICBmaWx0ZXIoVGhlbWEgPT0gIkZsw7xjaHRsaW5nZSIpIAoKCiNTdGltbWJldGVpbGlndW5nIEthbnRvbmUgaW0gVmVyZ2xlaWNoIGbDvHIgQWJzdGltbXVuZ2VuCmdncGxvdChhdXNsw6RuZGVyLCBhZXMoYW5yLCBiZXQsIGZpbGw9IGFubmFobWUpKSsKICBnZW9tX2NvbCgpCgojZ2xpbXBzZShkZikKYGBgCgoKCmBgYHtyfSAKI2Vpbmdlc2NocsOkbmt0ZXIgRGF0ZW5zYXR6IGbDvHIgVmlzdWFsaXNpZXJ1bmcKZGZfdmlzIDwtIGRmICU+JSAKICBzZWxlY3QoYW5yLCBKYWhyLCBLdXJ6dGl0ZWwsIHJlY2h0c2Zvcm0sIGJyLnBvcywgU2ljaGVyaGVpdHNwb2xpdGlrOnJlbGV2YW50KSAKCmBgYAoKCmBgYHtyfSAKI0FuemFobCBBYnN0aW1tdW5nZW4sIGdydXBwaWVydCBuYWNoIEphaHJ6ZWhudCAmIFRoZW1hLCBuZWJlbmVpbmFuZGVyCmRmX3ZpcyAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50LCBUaGVtYSkgJT4lIAogIGNvdW50KCkgJT4lIAogIGdncGxvdChhZXMoSmFocnplaG50LCBuLCBmaWxsID0gVGhlbWEpKSArCiAgZ2VvbV9iYXIocG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKQoKI0FuemFobCBBYnN0aW1tdW5nZW4sIGdydXBwaWVydCBuYWNoIEphaHJ6ZWhudCAmIFRoZW1hLCBzdGFja2VkCmRmX3ZpcyAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50LCByZWxldmFudCwgVGhlbWEpICU+JSAKICBjb3VudCgpICU+JSAKICBnZ3Bsb3QoYWVzKEphaHJ6ZWhudCwgbiwgZmlsbCA9IFRoZW1hKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uPSJzdGFjayIsIHN0YXQ9ImlkZW50aXR5IikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikgKwogIGxhYnModGl0bGUgPSAiQW56YWhsIEFic3RpbW11bmdlbiBwcm8gSmFocnplaG50Iiwgc3VidGl0bGUgPSAgIkdydXBwaWVydCBuYWNoIFRoZW1lbiB1bnNlcmVzIEJlaXRyYWdlcyAmIFJlc3QiLCB5ID0gIkFuemFobCIpCgoKCgpkZl92aXMgJT4lIAogIGZpbHRlcihUaGVtYSA9PSAiQXVzbMOkbmRlciJ8VGhlbWEgPT0gIkZsw7xjaHRsaW5nZSIpICU+JSAKICBncm91cF9ieShKYWhyemVobnQsIHJlbGV2YW50LCBUaGVtYSkgJT4lIAogIGNvdW50KCkgJT4lIAogIGdncGxvdChhZXMoSmFocnplaG50LCBuLCBmaWxsID0gVGhlbWEpKSArCiAgZ2VvbV9iYXIocG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKSArCiAgbGFicyh0aXRsZSA9ICJBbnphaGwgQWJzdGltbXVuZ2VuIHBybyBKYWhyemVobnQiLCBzdWJ0aXRsZSA9ICAiR3J1cHBpZXJ0IG5hY2ggVGhlbWVuIHVuc2VyZXMgQmVpdHJhZ2VzICYgUmVzdCIsIHkgPSAiQW56YWhsIikKCgpkZiAlPiUgCiAgZmlsdGVyKFRoZW1hID09ICJBdXNsw6RuZGVyInxUaGVtYSA9PSAiRmzDvGNodGxpbmdlIikgJT4lIAogIGdyb3VwX2J5KEphaHJ6ZWhudCwgVGhlbWEsIGFubmFobWUpICU+JSAKICBjb3VudCgpICU+JSAKICBnZ3Bsb3QoYWVzKEphaHJ6ZWhudCwgbiwgZmlsbCA9IGFubmFobWUpKSArCiAgZ2VvbV9iYXIocG9zaXRpb249InN0YWNrIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgI3NjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikgKwogIGxhYnModGl0bGUgPSAiQW56YWhsIEFic3RpbW11bmdlbiB6dSBGbMO8Y2h0bGluZ2UgLyBBdXNsw6RuZGVyIiwgc3VidGl0bGUgPSAgIkFuZ2Vub21tZW5lICYgYWJnZWxlaG50ZSIsIHkgPSAiQW56YWhsIikKCmBgYAoKCmBgYHtyfSAKI0Fic3RpbW11bmdlbiwgZ3J1cHBpZXJ0IG5hY2ggUmVjaHRzZm9ybSAmIEphaHJ6ZWhudApkZiAlPiUgCiAgZmlsdGVyKHJlbGV2YW50ID09ICJqYSIpICU+JSAKICBncm91cF9ieShKYWhyemVobnQsIHJlY2h0c2Zvcm0sIFRoZW1hLGFubmFobWUpICU+JSAKICBjb3VudCgpICU+JSAKICBnZ3Bsb3QoYWVzKEphaHJ6ZWhudCwgcmVjaHRzZm9ybSwgY29sb3IgPSBhbm5haG1lKSkgKwogIGdlb21faml0dGVyKCkgKwogICNzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKSArCiAgZmFjZXRfd3JhcCh+VGhlbWEpCgpgYGAKCgpgYGB7cn0gCiNBbnphaGwgQWJzdGltbXVuZ2VuIHBybyBKYWhyemVobnQgaW4gWmFobGVuIChudXIgcmVsZXZhbnRlIFRoZW1lbikKZGYgJT4lIAogIGZpbHRlcihKYWhyID4gMTkxMCwgcmVsZXZhbnQgPT0gImphIikgJT4lIAogIGdyb3VwX2J5KEphaHJ6ZWhudCwgVGhlbWEpICU+JSAKICBjb3VudCgpCgojQW56YWhsIEFic3RpbW11bmdlbiBwcm8gUmVjaHRzZm9ybSArIFBvc2l0aW9uIEJ1bmRlc3JhdCBpbiBaYWhsZW4gKG51ciByZWxldmFudGUgVGhlbWVuKQpkZl92aXMgJT4lIAogIGZpbHRlcihKYWhyID4gMTkxMCwgcmVsZXZhbnQgPT0gImphIikgJT4lIAogIGdyb3VwX2J5KHJlY2h0c2Zvcm0sIFRoZW1hLCBici5wb3MpICU+JSAKICBjb3VudCgpCgoKYXVzbMOkbmRlciA8LSBkZiAlPiUgCiAgZmlsdGVyKFRoZW1hID09ICJBdXNsw6RuZGVyIikKCmZsdWNodCA8LSBkZiAlPiUgCiAgZmlsdGVyKFRoZW1hID09ICJGbMO8Y2h0bGluZ2UiKQoKICAKYGBgCgoKYGBge3J9IAoKcG9zaXRpb25lbl9iciA8LSBnZ3Bsb3QoZGYsIGFlcyggSmFocixyZWNodHNmb3JtLCBjb2xvciA9IGJyLnBvcyApKSArIGdlb21faml0dGVyKCkgKyBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKSAKCnBvc2l0aW9uZW5fYnIKCmdncGxvdChkZiwgYWVzKEphaHIsIGJyLnBvcywgY29sb3IgPSBUaGVtYSwgc2hhcGUgPSByZWNodHNmb3JtKSkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC43KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikgCiAgI3NjYWxlX3lfZGlzY3JldGUoYnJlYWtzID0gc2VxKDE4MjAsIDIwMjIsIDEwKSkKCiAgZGYgJT4lIAogIGZpbHRlcihyZWxldmFudCA9PSAiamEiKSAlPiUgCiAgZ2dwbG90KGFlcyhici5wb3MsIFRoZW1hLCBjb2xvciA9IHJlY2h0c2Zvcm0pLCBuYS5ybSA9IFRSVUUpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuNykgICArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikgCiAgI3NjYWxlX3lfZGlzY3JldGUoYnJlYWtzID0gc2VxKDE4MjAsIDIwMjIsIDEwKSkKICAKICAKICBkZiAlPiUgCiAgZmlsdGVyKHJlbGV2YW50ID09ICJqYSIpICU+JSAKICBnZ3Bsb3QoYWVzKFRoZW1hLCByZWNodHNmb3JtLCBjb2xvciA9IGJyLnBvcykpICsKICBnZW9tX2ppdHRlcigpIAogICNzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKSAKICAjc2NhbGVfeV9kaXNjcmV0ZShicmVha3MgPSBzZXEoMTgyMCwgMjAyMiwgMTApKQogIAogIAogIGRmICU+JSAKICBmaWx0ZXIocmVsZXZhbnQgPT0gImphIikgJT4lIAogIGdncGxvdChhZXMoSmFociwgYnIucG9zLCBzaGFwZSA9IFRoZW1hLCBjb2xvciA9IHJlY2h0c2Zvcm0pKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjcpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKSAKICAjc2NhbGVfeV9kaXNjcmV0ZShicmVha3MgPSBzZXEoMTgyMCwgMjAyMiwgMTApKQpgYGAKCgpgYGB7cn0gCmdncGxvdChkZiwgYWVzKEphaHIsIHZvbGssIGNvbG9yID0gVGhlbWEsIHNpemUgPSB2b2xramEucHJveikpICsKICAgIGdlb21faml0dGVyKCkgKwogICAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikgCgoKZGYgJT4lIAogIGZpbHRlcihyZWxldmFudCA9PSAxKSAlPiUgCiAgZ2dwbG90KGFlcyhKYWhyLCB2b2xrLCBjb2xvciA9IFRoZW1hLCBzaXplID0gdm9sa2phLnByb3opKSArCiAgICBnZW9tX2ppdHRlcigpICsKICAgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTcGVjdHJhbCIpIAoKYGBgCgoKYGBge3J9IApkZl92aXMgJT4lIAogIGdyb3VwX2J5KEphaHIsIHJlbGV2YW50LCBUaGVtYSkgJT4lIAogIGNvdW50KCkgJT4lIAogIGdncGxvdChhZXMoSmFociwgbiwgZmlsbCA9IFRoZW1hKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uPSJzdGFjayIsIHN0YXQ9ImlkZW50aXR5IikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikKYGBgCgoKYGBge3J9CmRmX3ZpcyAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50LCBKYWhyLCByZWxldmFudCwgVGhlbWEpICU+JSAKICBjb3VudCgpICU+JSAKICBnZ3Bsb3QoYWVzKEphaHIsIG4sIGNvbG9yID0gVGhlbWEpKSArCiAgZ2VvbV9wb2ludCgpICsKICBmYWNldF93cmFwKH5KYWhyemVobnQpCgpgYGAKCgpgYGB7cn0gCmRmX3ZpcyAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50LCByZWxldmFudCwgVGhlbWEpICU+JSAKICBjb3VudCgpICU+JSAKICBnZ3Bsb3QoYWVzKEphaHJ6ZWhudCwgbiwgZmlsbCA9IHJlbGV2YW50KSkgKwogIGdlb21fYmFyKHBvc2l0aW9uPSJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgCgpnZ3Bsb3QoZGZfdmlzLCBhZXMoSmFociwgVGhlbWEpKSsKICBnZW9tX2NvbCgpCgpgYGAKCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojVmlzdWFsaXNpZXJ1bmdlbgptZWRpYSA8LSBhdXNsw6RuZGVyICU+JQogIHNlbGVjdChLdXJ6dGl0ZWwsIHJlY2h0c2Zvcm0sIG1lZGlhdG9uLmQsIG1lZGlhdG9uLmYsIG1lZGlhdG9uLnRvdCkgCgpnZ3Bsb3QobWVkaWEsIGFlcyhyZWNodHNmb3JtLCBtZWRpYXRvbi50b3QsIG5hLnJtID0gVFJVRSkpICsKICBnZW9tX2JveHBsb3QoKQoKZ2dwbG90KG1lZGlhLCBhZXMoVGl0ZWwsIG1lZGlhdG9uLmQsIG1lZGlhdG9uLmYpKSArCiAgZ2VvbV9qaXR0ZXIoKSAKCnBvcyA8LSBkYXRhX2NkYSAlPiUKICBzZWxlY3QoVGl0ZWwsIG5hbWVzKHBvc2l0aW9uZW4pKQpgYGAKCgpgYGB7cn0KZ2dwbG90KGRmLCBhZXMoSmFocikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oKQoKCmRmICU+JSAKICBtdXRhdGUoSmFocnplaG50ID0gYXMuZmFjdG9yKGZsb29yKEphaHIvMTApKjEwKSkgJT4lCiAgZ3JvdXBfYnkoSmFocnplaG50LCBkMWUxKSAlPiUgCiAgY291bnQoKSAlPiUgCiAgZ2dwbG90KGFlcyhKYWhyemVobnQsIG4sIGZpbGwgPSBkMWUxKSkgKyAKICBnZW9tX2Jhcihwb3NpdGlvbj0iZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTcGVjdHJhbCIpCmBgYAoKCmBgYHtyfQpkZiAlPiUgCiAgc2VsZWN0KEphaHJ6ZWhudCwgcmVsZXZhbnQpICU+JSAKICBncm91cF9ieShKYWhyemVobnQsIHJlbGV2YW50KSAlPiUgCiAgY291bnQoKSAlPiUgCiAgZ2dwbG90KGFlcyhKYWhyemVobnQsIG4sIGNvbG9yID0gcmVsZXZhbnQpKSArIAogIGdlb21fYmFyKHBvc2l0aW9uPSJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikKCgpkZiAlPiUgCiAgc2VsZWN0KEphaHJ6ZWhudCwgdGl0ZWxfa3Vyel9kKSAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50KSAlPiUgCiAgY291bnQoKSAlPiUgCiAgZ2dwbG90KGFlcyhKYWhyemVobnQsIG4pKSArIAogIGdlb21fYmFyKHBvc2l0aW9uPSJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikKYGBgCgoKYGBge3J9CmRmICU+JSBtdXRhdGUoSmFocnplaG50ID0gYXMuZmFjdG9yKGZsb29yKEphaHIvMTApKjEwKSkgJT4lCiAgc2VsZWN0KEphaHIsIEphaHJ6ZWhudCwgU2ljaGVyaGVpdHNwb2xpdGlrLCBBdXNzZW5wb2xpdGlrLCBBdXNsw6RuZGVyKSAlPiUgCiAgZ3JvdXBfYnkoSmFocikgJT4lIAogIGdncGxvdChhZXMoSmFocikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oKSAKCgoKYGBgCgoKYGBge3J9CmRmICU+JSAKICBtdXRhdGUoSmFocnplaG50ID0gYXMuZmFjdG9yKGZsb29yKEphaHIvMTApKjEwKSkgJT4lCiAgZmlsdGVyKGQxZTF8ZDJlMXxkM2UxICVpbiUgYygiQXVzc2VucG9saXRpayIsICJTaWNoZXJoZWl0c3BvbGl0aWsiLCAiU296aWFscG9saXRpayIpKSAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50LCBkMWUxLCBkMmUxKSAlPiUgCiAgY291bnQoKSAlPiUgCiAgZ2dwbG90KGFlcyhKYWhyemVobnQsIG4sIGZpbGwgPSBkMWUxKSkgKyAKICBnZW9tX2NvbChwb3NpdGlvbj0iZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTcGVjdHJhbCIpCgoKCgpkZiAlPiUgCiAgbXV0YXRlKEphaHJ6ZWhudCA9IGFzLmZhY3RvcihmbG9vcihKYWhyLzEwKSoxMCkpICU+JQogIGZpbHRlcihkMWUxICVpbiUgYygiQXVzc2VucG9saXRpayIsICJTaWNoZXJoZWl0c3BvbGl0aWsiLCAiU296aWFscG9saXRpayIpKSAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50LCBkMWUxLCBkMmUxKSAlPiUgCiAgY291bnQoKSAlPiUgCiAgZ2dwbG90KGFlcyhKYWhyemVobnQsIG4sIGZpbGwgPSBkMWUxKSkgKyAKICBnZW9tX2NvbChwb3NpdGlvbj0iZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTcGVjdHJhbCIpCgpgYGAKCgpgYGB7cn0KZGYgJT4lIAogIG11dGF0ZShKYWhyemVobnQgPSBhcy5mYWN0b3IoZmxvb3IoSmFoci8xMCkqMTApKSAlPiUKICBmaWx0ZXIoZDFlMXxkMmUxfGQzZTEgJWluJSBjKCJBdXNzZW5wb2xpdGlrIiwgIlNpY2hlcmhlaXRzcG9saXRpayIsICJTb3ppYWxwb2xpdGlrIikpICU+JSAKICBncm91cF9ieShkMWUxLCBKYWhyKSAlPiUgCiAgY291bnQoKSAKCgoKYGBgCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojU2Fua2V5CmQgPC0gZGYgJT4lIAogIGZpbHRlcihyZWNodHNmb3JtICE9ICJTdGljaGZyYWdlIiwgcmVsZXZhbnQgPT0gImphIikgJT4lIAogIHNlbGVjdChUaGVtYSwgcmVjaHRzZm9ybSwgYnYucG9zLCAgYW5uYWhtZSkKCgpoY2hhcnQoZGF0YV90b19zYW5rZXkoZCksICJzYW5rZXkiLCBuYW1lID0gIlJlc3VsdGF0IikKCgpkMiA8LSBkZiAlPiUgCiAgZmlsdGVyKHJlY2h0c2Zvcm0gIT0gIlN0aWNoZnJhZ2UiLCByZWxldmFudCA9PSAiamEiKSAlPiUgCiAgc2VsZWN0KFRoZW1hLCByZWNodHNmb3JtLCAgcC5zdnAsIGFubmFobWUpICU+JSAKICBkcm9wX25hKC4pCgoKaGNoYXJ0KGRhdGFfdG9fc2Fua2V5KGQyKSwgInNhbmtleSIsIG5hbWUgPSAiUmVzdWx0YXQiKQoKCmQ0IDwtIGRmICU+JSAKICBmaWx0ZXIocmVjaHRzZm9ybSAhPSAiU3RpY2hmcmFnZSIsIFRoZW1hID09ICJBdXNsw6RuZGVyIikgJT4lIAogIHNlbGVjdChUaGVtYSwgcmVjaHRzZm9ybSwgIGJ2LnBvcywgYW5uYWhtZSkgJT4lIAogIGRyb3BfbmEoLikKCgpoY2hhcnQoZGF0YV90b19zYW5rZXkoZDQpLCAic2Fua2V5IiwgbmFtZSA9ICJSZXN1bHRhdCIpCgoKCmQzIDwtIGRmICU+JSAKICBmaWx0ZXIocmVjaHRzZm9ybSAhPSAiU3RpY2hmcmFnZSIpICU+JSAKICBzZWxlY3QocmVjaHRzZm9ybSwgYnIucG9zLCB2b2xrLCBzdGFuZCwgIGFubmFobWUpICU+JSAKICBtdXRhdGUodm9sayA9IGNhc2Vfd2hlbih2b2xrID09ICJhbmdlbm9tbWVuIn4gIkFubmFobWUgVm9sayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sayA9PSAiYWJnZWxlaG50In4gIkFibGVobnVuZyBWb2xrIikpICU+JSAKICBtdXRhdGUoc3RhbmQgPSBjYXNlX3doZW4oc3RhbmQgPT0gImFuZ2Vub21tZW4ifiAiQW5uYWhtZSBTdMOkbmRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmQgPT0gImFiZ2VsZWhudCJ+ICJBYmxlaG51bmcgU3TDpG5kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kID09ICJTdMOkbmRlbWVociBuaWNodCBuw7Z0aWciIH4gIlN0w6RuZGVtZWhyIG5pY2h0IG7DtnRpZyIpKSAlPiUgCiAgZHJvcF9uYSguKQoKCihwbCA8LSBoY2hhcnQoZGF0YV90b19zYW5rZXkoZDMpLCAic2Fua2V5IiwgbmFtZSA9ICJSZXN1bHRhdCIsIHdpZHRoID0gIDUpKSAKcGwgPC0gcGwgJT4lIGhjX3RpdGxlKHRleHQgPSAiWnVzYW1tZW5oYW5nIHp3aXNjaGVuIFBvc2l0aW9uIGRlcyBCdW5kZXNyYXRzIHVuZCBSZXN1bHRhdCBkZXIgQWJzdGltbXVuZyIpICU+JSAKICBoY19zaXplKGhlaWdodCA9IDUwMCwgd2lkdGggPSA2MDApCgpodG1sd2lkZ2V0czo6c2F2ZVdpZGdldCh3aWRnZXQgPSBwbCwgZmlsZSA9ICJDOi9Vc2Vycy9BbnRvbmlhL3Rlc3QuaHRtbCIpCgoKYGBgCgpgYGB7cn0KIyBBbHRlciBjb2RlLWNodW5rCiMgZGZfbmV1IDwtIGRmX2NsZWFuICU+JQojICBmaWx0ZXIoZDFlM3xkMmUzfGQzZTMgJWluJSB0aGVtZW4pICU+JQojICBzZWxlY3RfaWYofnN1bSghaXMubmEoLikpID4gMCkgJT4lICNudXIgU3BhbHRlbiB3w6RobGVuLCBkaWUgbmljaHQgenUgMTAwJSBOQXMgc2luZAojICByb3d3aXNlKCkgJT4lCiMgIG11dGF0ZShhbGxlX2thdCA9IGxpc3QoYyhkMWUzLCAgZDJlMywgIGQzZTMpKSkgJT4lCiMgIG11dGF0ZShhbGxlX2thdCA9IGxpc3QoYWxsZV9rYXRbIWlzLm5hKGFsbGVfa2F0KV0pKSAKYGBgCgpgYGB7cn0KCnZvbGtqYV9wcm96X3RhYiA8LSBzZWxlY3QoZGYsYW5yLCB2b2xramEucHJveikKCmF1c19hbnIgPC0gc2VsZWN0KGF1c2zDpG5kZXIsIGFucikKYXVzX2FuciA9IGF1c19hbnJbYXVzX2FuclsnYW5yJ10gIT0gIjU1Mi4zIl0KYXVzX2FuciA8LSBhcy5kYXRhLmZyYW1lKGF1c19hbnIpICU+JSAKICByZW5hbWUoYW5yPWF1c19hbnIpCiNmbHVfYW5yIDwtIHNlbGVjdChmbMO8Y2h0bGluZywgYW5yKQojYW5yX3RvdCA8LSBiaW5kX3Jvd3MoYXVzX2FuciwgZmx1X2FucikgCiNhbnJfdG90IDwtIHRyYW5zZm9ybShhbnJfdG90LCBhbnIgPSBhcy5udW1lcmljKGFucikpCiNhbnJfdG90IDwtIGFycmFuZ2UoYW5yX3RvdCwgYW5yKQoKI3ZvbGtqYV9wcm96X3RhYiA8LSB0cmFuc2Zvcm0odm9sa2phX3Byb3pfdGFiLCBhbnIgPSBhcy5udW1lcmljKGFucikpCgp0aGVtYV92b2xrIDwtIGlubmVyX2pvaW4oYXVzX2Fuciwgdm9sa2phX3Byb3pfdGFiKQp0aGVtYV92b2xrJGFuciA8LSBOVUxMCgojdGhlbWFfdm9sayRhbnIgPC0gTlVMTAoKI2JpbmRfY29scyh0aGVtYV92b2xrLCBrYW50b25lX2phcHJvel9rb3JyKQpgYGAKCgpgYGB7cn0Ka29ycmVrdHVyIDwtIGMoMCwwLDAsMCwwLDAsMCwxMDAsMTAwLDAsMCwwLDEwMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTAwKQprYW50b25lX2phcHJvel9rb3JyIDwtIGRhdGEuZnJhbWUoa2FudG9uZV9qYXByb3opCmthbnRvbmVfamFwcm96X2tvcnIgPC0gYmluZF9jb2xzKGthbnRvbmVfamFwcm96X2tvcnIsIHRoZW1hX3ZvbGspCgpmb3IgKGkgaW4gMTpsZW5ndGgoa2FudG9uZV9qYXByb3pfa29ycikpIHsKICBrYW50b25lX2phcHJvel9rb3JyWyxpXSA8LSBhYnMoa2FudG9uZV9qYXByb3pfa29yclssaV0gLWtvcnJla3R1cikKfQoKa2FudG9uZV9qYXByb3pfa29yciRqdS5qYXByb3ogPC0gTlVMTAprYW50b25lX2phcHJvel9tZWFuIDwtIGRhdGEuZnJhbWUoY29sTWVhbnMoa2FudG9uZV9qYXByb3pfa29ycikpCmthbnRvbmVfamFwcm96X21lYW4gPC0ga2FudG9uZV9qYXByb3pfbWVhbiAlPiUgCiAgbXV0YXRlKGNvbnRyYV92ZXJzY2jDpHJmdW5nID0gMTAwLSBrYW50b25lX2phcHJvel9tZWFuJGNvbE1lYW5zLmthbnRvbmVfamFwcm96X2tvcnIuKQoKa2FudG9uZV9qYXByb3pfbWVhbiA8LSBrYW50b25lX2phcHJvel9tZWFuICU+JSAKICByZW5hbWUocHJvX3ZlcnNjaMOkcmZ1bmcgPSBjb2xNZWFucy5rYW50b25lX2phcHJvel9rb3JyLikKCmthbnRvbmVfamFwcm96X21lYW5bIkthbnRvbmUiXSA8LSByb3duYW1lcyhrYW50b25lX2phcHJvel9tZWFuKQoKa2FudG9uZV9qYXByb3pfbWVhbiA8LSBrYW50b25lX2phcHJvel9tZWFuICU+JSAKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gcHJvX3ZlcnNjaMOkcmZ1bmc6Y29udHJhX3ZlcnNjaMOkcmZ1bmcsIAogICAgbmFtZXNfdG8gPSAiUG9zaXRpb24iLCAKICAgIHZhbHVlc190byA9ICJQcm96ZW50IgopCgp2ZXJzY2jDpHJmdW5nIDwtIGdncGxvdChrYW50b25lX2phcHJvel9tZWFuLCBhZXMoeD1yZW9yZGVyKEthbnRvbmUsIFByb3plbnQpLCB5PVByb3plbnQsIGZpbGw9UG9zaXRpb24pKSsKICBnZW9tX2Jhcihwb3NpdGlvbj0ic3RhY2siLCBzdGF0ID0gImlkZW50aXR5IikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpnZ3Bsb3RseSh2ZXJzY2jDpHJmdW5nKQpgYGAKCgpgYGB7cn0KdGVzdCA8LSBhdXNsw6RuZGVyICU+JSAKICBzZWxlY3QoS3VyenRpdGVsLCB6aGphLnByb3opCgoKCgpgYGAKCmBgYHtyfQp4bHN4RmlsZSA8LSAiaHR0cHM6Ly93d3cuc2VtLmFkbWluLmNoL2RhbS9zZW0vZGUvZGF0YS9wdWJsaXNlcnZpY2Uvc3RhdGlzdGlrL2FzeWxzdGF0aXN0aWsvdWViZXJzaWNodGVuL2dlc3VjaGUtbmF0aW9uLWFiLTE5ODYtZC54bHN4LmRvd25sb2FkLnhsc3gvZ2VzdWNoZS1uYXRpb24tYWItMTk4Ni1kLnhsc3giCmFzX25hdGlvbiA8LSByZWFkLnhsc3goeGxzeEZpbGUpCmFzX25hdGlvblsxLDFdIDwtICJDb3VudHJ5Igphc19uYXRpb25bMSwzOF0gPC0gIjIwMjIiCmFzLmNoYXJhY3Rlcihhc19uYXRpb25bMSwgXSkKbmFtZXMoYXNfbmF0aW9uKSA8LSBhc19uYXRpb25bMSxdCmFzX25hdGlvbiA8LSBhc19uYXRpb25bLTEsXQp0b3RhbCA8LSBhc19uYXRpb25bMTg2LF0KYXNfbmF0aW9uIDwtIGFzX25hdGlvblstMTg2LF0KCmBgYAoKYGBge3J9CmN1bV9uYXQgPC0gYXNfbmF0aW9uICU+JSAKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gIjE5ODYiOiIyMDIyIiwKICAgIG5hbWVzX3RvID0gIkphaHIiLCAKICAgIHZhbHVlc190byA9ICJBbnphaGwiCiAgKQoKY3VtX25hdCA8LSB0cmFuc2Zvcm0oY3VtX25hdCwgQW56YWhsID0gYXMubnVtZXJpYyhBbnphaGwpKQoKdG9wX2xhbmQgPC0gYWdncmVnYXRlKGN1bV9uYXQkQW56YWhsLCBieT1saXN0KExhbmQ9Y3VtX25hdCRDb3VudHJ5KSwgRlVOPXN1bSkKdG9wX2xhbmQgPC0gdG9wX2xhbmQgJT4lIAogIGFycmFuZ2UoZGVzYyh4KSkgJT4lIAogIHVuZ3JvdXAoKQoKbGFlbmRlciA8LSBhc19uYXRpb25bLDFdCgp0b3BfMjAgPC0gdG9wX2xhbmQgJT4lIAogIG11dGF0ZShMYW5kPWlmZWxzZShMYW5kICVpbiUgaGVhZChMYW5kLCAyMCksIAogICAgICAgICAgICAgICAgICAgICBMYW5kLCAiQW5kZXJlIikpCnRvcF8yMCA8LSBhZ2dyZWdhdGUodG9wXzIwJHgsIGJ5PWxpc3QoSGVya3VuZnRzbGFuZD10b3BfMjAkTGFuZCksIEZVTj1zdW0pCmBgYAoKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9Cgphc19uYXRpb25bMjozOF0gPC0gc2FwcGx5KGFzX25hdGlvblsyOjM4XSxhcy5udW1lcmljKQpzYXBwbHkoYXNfbmF0aW9uLCBjbGFzcykKCmN1bV9uYXQgPC0gdHJhbnNmb3JtKGN1bV9uYXQsIEFuemFobCA9IGFzLm51bWVyaWMoQW56YWhsKSkKCgoKdG9wX2xhbmQgPC0gYWdncmVnYXRlKGN1bV9uYXQkQW56YWhsLCBieT1saXN0KExhbmQ9Y3VtX25hdCRDb3VudHJ5KSwgRlVOPXN1bSkKdG9wX2xhbmQgPC0gdG9wX2xhbmQgJT4lIAogIGFycmFuZ2UoZGVzYyh4KSkgJT4lIAogIHVuZ3JvdXAoKQoKbGFlbmRlciA8LSBhc19uYXRpb25bLDFdCgp0b3BfMjAgPC0gdG9wX2xhbmQgJT4lIAogIG11dGF0ZShMYW5kPWlmZWxzZShMYW5kICVpbiUgaGVhZChMYW5kLCAyMCksIAogICAgICAgICAgICAgICAgICAgICBMYW5kLCAiQW5kZXJlIikpCnRvcF8yMCA8LSBhZ2dyZWdhdGUodG9wXzIwJHgsIGJ5PWxpc3QoSGVya3VuZnRzbGFuZD10b3BfMjAkTGFuZCksIEZVTj1zdW0pCiNnZ3Bsb3QoY3VtX25hdCwgYWVzKHg9SmFociwgeT1BbnphaGwsIGZpbGw9Q291bnRyeSkpKwogIyBnZW9tX2FyZWEoKQpgYGAK